/*
 * @Description: 类及其类型
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-04-30 15:02:46
 * @LastEditTime: 2021-04-30 17:37:05
 */

/* 类演示 */
class P {
    name: string;
    age: number;
    gender: string;

    // 构造函数
    constructor(name: string, age: number, gender: string = "男") {
        // 注意：在函数的参数中若有默认值，在传参时是可以不传的。
        // 但此参数必须放到参数的末尾，若放到开始，则也是必传
        this.name = name
        this.age = age
        this.gender = gender
    }

    sayHi(str: string) {
        console.log(`Hello ${this.name}，` + str);
    }
}

let p = new P("小明", 18, "男")

p.sayHi("我爱你！") // Hello 小明，我爱你！

/**
 * 类类型：类实现某个接口，使用`implements`关键字
 * 一个类可以实现多个接口
 */
interface persion {
    name: string
    age: number
    gender: string
    /* 方法的两种接口定义方式 */
    sayHello: (str: string) => void
    sayHi(str: string): void
}
interface persion2 {
    id: number
    setAge?(age: number): void
}

class A extends P implements persion, persion2 {
    id: number = Date.now()

    sayHello() {
        console.log("Hello Typescript");
    }

    // setAge(age: number) {
    //     this.age = age
    // }
}

let a = new A("小红", 12, "女")
a.sayHello()    // Hello Typescript